class TileContainer
{
  //tablica Tili
  Tile [][] Container;
  // rozmiar tablicy, zawsze kwadratowa
  int Dimension;
  //Obiekt który pozwala na przesuwanie elementów
  TileMovement tileMovement;   
  //pozycja pustego Tila
  PVector EmptyTilePosition;
  TileContainer(int dimension, PImage snapshot)
  {

    EmptyTilePosition=new PVector(0, 0);

    Dimension=dimension;
    Container=new Tile[Dimension][Dimension];


    int w=0;
    for (int i=0; i<Dimension; i++)
    {
      for (int j=0; j <Dimension; j++)
      {
        PImage c=snapshot.get(TILESIZE*j, TILESIZE*i, TILESIZE, TILESIZE); 
        Container[i][j]=(new Tile(c, w, new PVector(i, j)));
        c.save(str(w));
        w++;
      }
    }

    tileMovement=new TileMovement(this);


    EmptyTilePosition=tileMovement.shuffle();


    if (!tileMovement.isSolvable(DIMENSION*DIMENSION, DIMENSION*DIMENSION, (int)EmptyTilePosition.y + 1)) {
      if (EmptyTilePosition.y == 0 && EmptyTilePosition.x <= 1) {
        tileMovement.swapShuffle(new PVector(DIMENSION*DIMENSION - 2, DIMENSION*DIMENSION - 1), new PVector( DIMENSION*DIMENSION - 1, DIMENSION*DIMENSION - 1));
      } else {
        tileMovement.swapShuffle(new PVector(0, 0), new PVector( 1, 0));
      }
      EmptyTilePosition=tileMovement.getEmpty();
    }
    //    Solver solver=new Solver(tileMovement);
    //    println(str(solver.CalculateManhattan()));
    //    println(str(tileMovement.isSolvable()));
  }

  void display()
  {

    for (int i=0; i<Dimension; i++)
    {
      for (int j=0; j<Dimension; j++)
      {  
        //temp dla Tile ktory jest sprawdzany
        Tile temp=Container[i][j];
        //wyswietl ten Tile
        image(temp.TileImage, j*TILESIZE+OFFSET, i*TILESIZE);
        //sprawdz czy sprawdzany Tile został kliknięty
        if (isOver(new PVector(j*TILESIZE+OFFSET, i*TILESIZE)) && mousePressed)
        {  //zamień Tile z tego wolnego na kliknięty, jeżeli odległość wynosi 2 lub 1( w zaleznosci od poziomu trudnosci) czyli jest w pobliżu
          if (tileMovement.swap(EmptyTilePosition, new PVector(i, j), true))
          {
            //jeżeli został kliknięty to ustaw że jest on kliknięty po to aby można było go przesrawić
            temp.IsClicked=true;
            //ustaw pusty na ten zamieniony
            EmptyTilePosition=new PVector(i, j);
          }
        } 
        //jeżeli nie został kliknięty ustaw że nie został kliknięty
        else if (!isOver(new PVector(j*TILESIZE+OFFSET, i*TILESIZE)) && mousePressed)
        {
          temp.IsClicked=false;
        }
      }
    }
  }
}

